package br.com.jk.cont.caixa;

import br.com.jk.empresa.Empresa;
import br.com.jk.util.parametro.ParametroData;
import br.com.jk.util.parametro.ParametroEmpresa;
import br.com.jk.util.pesquisa.Pesquisa.Opcao;
import java.math.BigDecimal;
import java.util.Date;
import java.util.List;

/**
 * @author camilo
 */
public interface CaixaDao {

  public static final String NAME_TABLE = "caixa";
  public static final String NAME_SCHEMA = "contabil";
  public static final String NAME_COLUMN_ID = "id";
  public static final String NAME_COLUMN_ID_IMP = "id_imp";
  public static final String NAME_COLUMN_DATA = "data_movimento";
  public static final String NAME_COLUMN_DOC = "doc";
  public static final String NAME_COLUMN_VALOR = "valor";
  public static final String NAME_COLUMN_OBSERVACAO = "observacao";
  public static final String NAME_COLUMN_ID_EMPRESA = "cod_empresa";
  public static final String NAME_COLUMN_ID_PLANO_CONTAS = "cod_plano_contas";
  public static final String NAME_COLUMN_ID_CONTA_BANCO = "cod_conta_corrente";
  public static final String NAME_COLUMN_ID_USUARIO_CADASTRO = "cod_usuario_cadastro";
  public static final String NAME_COLUMN_ID_USUARIO_ALTERACAO = "cod_usuario_alteracao";
  public static final String NAME_FK_PLANO_CONTAS = "fk_caixa_plano_contas";
  public static final String NAME_FK_CONTA_BANCO = "fk_caixa_conta_banco";
  public static final String NAME_FK_EMPRESA = "fk_caixa_empresa";
  public static final String NAME_FK_USUARIO_CADASTRO = "fk_caixa_usuario_cadastro";
  public static final String NAME_FK_USUARIO_ALTERACAO = "fk_caixa_usuario_alteracao";
  public static final String NAME_SEQUENCE = "caixa_id_seq";
  public static final String NAME_INDEX_ID = "in_caixa_id";
  public static final String NAME_INDEX_CAIXA = "in_caixa";

  public enum TipoConsultaData {

    /**
     * Indica que somente a data inicial sera utilizada
     */
    SOMENTE_DATA_INICIAL,
    /**
     * Indica que somente a data final sera utilizada
     */
    SOMENTE_DATA_FINAL,
    /**
     * Indica que ao informar o parametro serao consideradas as duas datas
     */
    PESQUISAR_INTERVALO
  }

  public void salvar(Caixa caixa);

  public void excluir(Caixa caixa);

  public Caixa carregar(int id);

  public List<Caixa> listar(ParametroData parData, ParametroEmpresa parEmp);

  /**
   * Retorna lista de registros de acordo o período informado
   *
   * @param dataIn
   * @param dataFin
   * @param tipo
   * @return
   */
  public List<Caixa> listarPorData(Date dataIn, Date dataFin, TipoConsultaData tipo);

  public List<Caixa> listarPorPlanoContas(Integer cod);

  public List<Caixa> pesquisaPadrao(String property, String criterio, Opcao opcao);

  public List<Caixa> pesquisaPadrao(String property, int criterio, Opcao opcao);

  /**
   * Retorna a soma dos valores dos lançamentos até a data especificada como parâmetro
   *
   * @param empresa Código da empresa para consulta
   * @param dataInicial Data limite da consulta, serão somados os valores anteriores a esta data
   * @return Saldo Inicial
   */
  public BigDecimal getSaldoInicial(Empresa empresa, Date dataInicial);

  /**
   * Retorna a soma dos valores dos lançamentos até a data especificada como parâmetro
   *
   * @param empresa Código da empresa para consulta
   * @param dataFinal Data limite da consulta, serão somados os valores até essa data
   * @return Saldo Final
   */
  public BigDecimal getSaldoFinal(Empresa empresa, Date dataFinal);
}
